home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Tech Arsenal 1
/
Tech Arsenal (Arsenal Computer).ISO
/
tek-01
/
oleo130s.zip
/
OLEO130S.TAR
/
oleo-1.3
/
io-utils.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-03-30
|
24KB
|
1,329 lines
/* Copyright (C) 1990, 1992, 1993 Free Software Foundation, Inc.
This file is part of Oleo, the GNU Spreadsheet.
Oleo is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
Oleo is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Oleo; see the file COPYING. If not, write to
the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
#include <stdio.h>
#include <ctype.h>
#include <math.h>
#include "sysdef.h"
#include "io-utils.h"
#include "cell.h"
#include "ref.h"
#include "decompile.h"
#include "io-generic.h"
#include "io-abstract.h"
#include "lists.h"
#include "io-term.h"
#include "cmd.h"
/* Routines for formatting cell values */
#ifdef __STDC__
struct user_fmt;
static char *pr_flt (double, struct user_fmt *, int);
static char *pr_int (long, struct user_fmt *, int);
#else
static char *pr_flt ();
static char *pr_int ();
#endif
/* Constants */
char *bname[] =
{
"#FALSE", "#TRUE"
};
char numb_oflo[] = "########################################";
double __plinf;
double __neinf;
double __nan;
char nname[] = "#NOT_A_NUMBER";
char iname[] = "#INFINITY";
char mname[] = "#MINUS_INFINITY";
static double
divide (a, b)
double a;
double b;
{
return a / b;
}
static RETSIGTYPE
ignore_sig (sig)
int sig;
{
(void)signal (SIGFPE, ignore_sig);
}
/* It's ok of this fails and generates signals. In that case,
* the same signal will occur when evaluating formulas and a
* (less informative) error value substituted. Note that this
* should be called before init_eval.
*/
#ifdef __STDC__
void
init_infinity (void)
#else
void
init_infinity ()
#endif
{
(void)signal (SIGFPE, ignore_sig);
__plinf = divide (1., 0.);
(void)signal (SIGFPE, ignore_sig);
__neinf = divide (-1., 0.);
(void)signal (SIGFPE, ignore_sig);
__nan = __plinf + __neinf;
}
/* Slightly larger than the maximum exponent we ever expect to see */
#define BIGFLT 309
#ifdef TEST
char print_buf[1024 * 8];
#else
char print_buf[BIGFLT + 20];
#endif
/* Structures/vars/functions for dealing with formatting floating-point
numbers, etc */
struct user_fmt
{
char *p_hdr, *n_hdr;
char *p_trl, *n_trl;
char *zero, *comma, *decpt;
unsigned char prec;
double scale;
};
struct user_fmt dol =
{
"$", "($", 0, ")", "$0", ",", ".", PRC_FLT, 1};
struct user_fmt cma =
{
0, "(", 0, ")", "0", ",", ".", PRC_FLT, 1};
struct user_fmt pct =
{
0, "-", "%", "%", "0%", 0, ".", PRC_FLT, 100};
struct user_fmt fxt =
{
0, "-", 0, 0, "0", 0, ".", PRC_FLT, 1};
/* Variables */
struct user_fmt u[16] =
{
{0, "-", 0, 0, "0", 0, ".", PRC_FLT, 1},
{0, "-", 0, 0, "0", 0, ".", PRC_FLT, 1},
{0, "-", 0, 0, "0", 0, ".", PRC_FLT, 1},
{0, "-", 0, 0, "0", 0, ".", PRC_FLT, 1},
{0, "-", 0, 0, "0", 0, ".", PRC_FLT, 1},
{0, "-", 0, 0, "0", 0, ".", PRC_FLT, 1},
{0, "-", 0, 0, "0", 0, ".", PRC_FLT, 1},
{0, "-", 0, 0, "0", 0, ".", PRC_FLT, 1},
{0, "-", 0, 0, "0", 0, ".", PRC_FLT, 1},
{0, "-", 0, 0, "0", 0, ".", PRC_FLT, 1},
{0, "-", 0, 0, "0", 0, ".", PRC_FLT, 1},
{0, "-", 0, 0, "0", 0, ".", PRC_FLT, 1},
{0, "-", 0, 0, "0", 0, ".", PRC_FLT, 1},
{0, "-", 0, 0, "0", 0, ".", PRC_FLT, 1},
{0, "-", 0, 0, "0", 0, ".", PRC_FLT, 1},
{0, "-", 0, 0, "0", 0, ".", PRC_FLT, 1},
};
/* Turn a floating-point number into the canonical text form. This scribbles
on print_buf */
#ifdef __STDC__
char *
flt_to_str (double val)
#else
char *
flt_to_str (val)
double val;
#endif
{
double f;
if (val == __plinf)
return iname;
if (val == __neinf)
return mname;
f = fabs (val);
if (f >= 1e6 || (f > 0 && f <= 9.9999e-6))
{
sprintf (print_buf, "%e", val);
return print_buf;
}
return pr_flt (val, &fxt, PRC_FLT);
}
#ifdef __STDC__
char *
long_to_str (long val)
#else
char *
long_to_str (val)
long val;
#endif
{
sprintf (print_buf, "%ld", val);
return print_buf;
}
/* create the human-readable version of the contents of a cell
This scribbles on print-buf bigtime */
#ifdef __STDC__
char *
print_cell (CELL *cp)
#else
char *
print_cell (cp)
CELL *cp;
#endif
{
int j;
int p;
long num;
static char zeroes[] = "000000000000000";
if (!cp)
return "";
j = GET_FMT (cp);
if (j == FMT_DEF)
j = default_fmt;
if (j == FMT_HID || GET_TYP (cp) == 0)
return "";
if (GET_TYP (cp) == TYP_STR)
return cp->cell_str;
if (GET_TYP (cp) == TYP_BOL)
{
#ifdef TEST
if (cp->cell_bol < 0 || cp->cell_bol > 1)
panic ("Bool %d out of range", cp->cell_bol);
#endif
return bname[cp->cell_bol];
}
if (GET_TYP (cp) == TYP_ERR)
{
#ifdef TEST
if (cp->cell_err > ERR_MAX || cp->cell_err < 0)
panic ("Error %d out of range", cp->cell_err);
#endif
return ename[cp->cell_err];
}
if (GET_TYP (cp) == TYP_FLT)
{
p = GET_PRC (j);
switch (j | PRC_FLT)
{
case FMT_GPH:
if (cp->cell_flt < 0)
{
j = '-';
num = -(cp->cell_flt);
}
else if (cp->cell_flt >= 1)
{
j = '+';
num = (cp->cell_flt);
}
else
{
j = '0';
num = 1;
}
graph:
if (num >= sizeof (print_buf))
{
io_error_msg ("Cannot graph %d '%c'", p, j);
num = sizeof (print_buf) - 1;
}
print_buf[num] = '\0';
while (--num >= 0)
print_buf[num] = j;
return print_buf;
case FMT_USR:
return pr_flt (cp->cell_flt, &u[p], u[p].prec);
case FMT_GEN:
{
double f;
f = fabs (cp->cell_flt);
if (f >= 1e6 || (f > 0 && f <= 9.9999e-6))
goto handle_exp;
return pr_flt (cp->cell_flt, &fxt, p);
}
case FMT_DOL:
return pr_flt (cp->cell_flt, &dol, p);
case FMT_CMA:
return pr_flt (cp->cell_flt, &cma, p);
case FMT_PCT:
return pr_flt (cp->cell_flt, &pct, p);
case FMT_FXT:
return pr_flt (cp->cell_flt, &fxt, p);
case FMT_EXP:
handle_exp:
if (cp->cell_flt == __plinf)
return iname;
if (cp->cell_flt == __neinf)
return mname;
if (p == PRC_FLT)
sprintf (print_buf, "%e", cp->cell_flt);
else
sprintf (print_buf, "%.*e", p, cp->cell_flt);
return print_buf;
#ifdef TEST
default:
panic ("Unknown format %d", j);
return 0;
#endif
}
}
if (GET_TYP (cp) == TYP_INT)
{
p = GET_PRC (j);
switch (j | PRC_FLT)
{
case FMT_GPH:
if (cp->cell_int < 0)
{
j = '-';
num = -(cp->cell_int);
}
else if (cp->cell_int >= 1)
{
j = '+';
num = (cp->cell_int);
}
else
{
j = '0';
num = 1;
}
goto graph;
case FMT_USR:
return pr_int (cp->cell_int, &u[p], u[p].prec);
case FMT_GEN:
sprintf (print_buf, "%ld", cp->cell_int);
return print_buf;
case FMT_DOL:
return pr_int (cp->cell_int, &dol, p);
case FMT_CMA:
return pr_int (cp->cell_int, &cma, p);
case FMT_PCT:
return pr_int (cp->cell_int, &pct, p);
case FMT_FXT:
if (p != PRC_FLT && p != 0)
sprintf (print_buf, "%ld.%.*s", cp->cell_int, p, zeroes);
else
sprintf (print_buf, "%ld", cp->cell_int);
return print_buf;
case FMT_EXP:
if (p != PRC_FLT)
sprintf (print_buf, "%.*e", p, (double) (cp->cell_int));
else
sprintf (print_buf, "%e", (double) (cp->cell_int));
return print_buf;
#ifdef TEST
default:
panic ("Unknown format %d", j);
return 0;
#endif
}
}
#ifdef TEST
panic ("Unknown cell type %d", GET_TYP (cp));
#endif
return 0;
}
/* Return the value of ROW,COL in a human-readable fashion
In paticular, strings have "" around them, and are \\ed
*/
#ifdef __STDC__
char *
cell_value_string (CELLREF row, CELLREF col)
#else
char *
cell_value_string (row, col)
CELLREF row;
CELLREF col;
#endif
{
CELL *cp;
cp = find_cell (row, col);
if (!cp || !GET_TYP (cp))
return "";
switch (GET_TYP (cp))
{
case TYP_FLT:
return flt_to_str (cp->cell_flt);
case TYP_INT:
sprintf (print_buf, "%ld", cp->cell_int);
return print_buf;
case TYP_STR:
return backslash_a_string (cp->cell_str, 1);
case TYP_BOL:
return bname[cp->cell_bol];
case TYP_ERR:
return ename[cp->cell_err];
#ifdef TEST
default:
panic ("unknown type %d in cell_value_string", GET_TYP (cp));
#endif
}
return 0;
}
static char *
pr_int (val, fmt, prec)
long val;
struct user_fmt *fmt;
int prec;
{
char *pf, *pff, *pt;
long int n;
int nn = 0;
pt = &print_buf[sizeof (print_buf) - 1];
*pt = '\0';
n = fmt->scale * ((val < 0) ? -val : val);
if (n == 0)
return fmt->zero ? fmt->zero : "";
pf = pff = (val < 0) ? fmt->n_trl : fmt->p_trl;
if (pf && *pf)
{
while (*pf)
pf++;
do
*--pt = *--pf;
while (pf != pff);
}
if (prec != PRC_FLT && prec != 0)
{
while (prec-- > 0)
*--pt = '0';
pf = pff = fmt->decpt;
if (pf)
{
while (*pf)
pf++;
do
*--pt = *--pf;
while (pf != pff);
}
/* *--pt='.'; */
}
do
{
*--pt = (n % 10) + '0';
n /= 10;
if (nn++ == 2 && n > 0)
{
if (fmt->comma && *(fmt->comma))
{
for (pf = pff = fmt->comma; *pf; pf++)
;
do
*--pt = *--pf;
while (pf != pff);
}
nn = 0;
}
}
while (n > 0);
pf = pff = (val < 0) ? fmt->n_hdr : fmt->p_hdr;
if (pf && *pf)
{
while (*pf)
pf++;
do
*--pt = *--pf;
while (pf != pff);
}
return pt;
}
static char *
pr_flt (val, fmt, prec)
double val;
struct user_fmt *fmt;
int prec;
{
char *iptr;
char *fptr;
char *pptr;
char *pf, *pff;
double fract, integer, tmpval;
int n;
int isneg;
int comlen;
val *= fmt->scale;
if (val == __plinf)
return iname;
if (val == __neinf)
return mname;
if (val != val)
return nname;
iptr = &print_buf[BIGFLT];
fptr = &print_buf[BIGFLT];
if (val == 0)
return fmt->zero ? fmt->zero : "";
if (val < 0)
{
isneg = 1;
val = -val;
}
else
isneg = 0;
comlen = 0;
if (fmt->comma && *(fmt->comma))
for (pf = fmt->comma; *pf; comlen++, pf++)
;
fract = modf (val, &integer);
n = 0;
do
{
if (iptr < &print_buf[comlen])
return numb_oflo;
tmpval = modf (integer / 10, &integer);
*--iptr = '0' + (int) ((tmpval + .01) * 10);
if (comlen && n++ == 2 && integer)
{
n = 0;
pff = fmt->comma;
pf = pff + comlen;
do
*--iptr = *--pf;
while (pf != pff);
}
}
while (integer);
if (prec)
{
int p1;
p1 = (prec == PRC_FLT) ? 15 : (prec > 0) ? prec : -prec;
pf = fmt->decpt;
while (pf && *pf)
*fptr++ = *pf++;
/* *fptr++='.'; */
if (fract)
{
do
{
fract = modf (fract * 10, &tmpval);
*fptr++ = '0' + (int) tmpval;
}
while (--p1 && fract);
}
if (prec > 0 && prec != PRC_FLT)
while (p1--)
*fptr++ = '0';
else
{
fract = 0;
while (fptr[-1] == '0')
--fptr;
while (!isdigit (fptr[-1]))
--fptr;
*fptr = '\0';
}
}
if (fract)
{
(void) modf (fract * 10, &tmpval);
if (tmpval > 4)
{
iptr[-1] = '0';
for (pptr = fptr - 1;; --pptr)
{
if (!isdigit (*pptr))
continue;
else if (*pptr == '9')
{
if (pptr == fptr - 1 && pptr > &print_buf[BIGFLT] && (prec < 0 || prec == PRC_FLT))
{
--fptr;
while (!isdigit (pptr[-1]))
{
--fptr;
--pptr;
}
*pptr = '\0';
}
else
*pptr = '0';
}
else
{
(*pptr)++;
break;
}
}
if (pptr < iptr)
{
--iptr;
if (n == 3)
{
char tmpch;
tmpch = *iptr++;
for (pf = pff = fmt->comma; *pf; pf++)
;
do
*--iptr = *--pf;
while (pf != pff);
*--iptr = tmpch;
}
}
}
}
pf = pff = (isneg) ? fmt->n_hdr : fmt->p_hdr;
if (pf && *pf)
{
while (*pf)
pf++;
do
*--iptr = *--pf;
while (pf != pff);
}
pf = (isneg) ? fmt->n_trl : fmt->p_trl;
while (pf && *pf)
*fptr++ = *pf++;
*fptr = 0;
return iptr;
}
#ifdef __STDC__
char *
adjust_prc (char *oldp, CELL *cp, int width, int smallwid, int just)
#else
char *
adjust_prc (oldp, cp, width, smallwid, just)
char *oldp;
CELL *cp;
int width;
int smallwid;
int just;
#endif
{
int fmt;
int prc;
struct user_fmt *ufmt;
char *bptr;
char *eptr;
int len;
fmt = GET_FMT (cp);
if (fmt == FMT_DEF)
fmt = default_fmt;
prc = GET_PRC (fmt);
switch (fmt | PRC_FLT)
{
case FMT_GPH:
case FMT_HID:
return numb_oflo;
case FMT_DOL:
ufmt = &dol;
goto deal_fmt;
case FMT_CMA:
ufmt = &cma;
goto deal_fmt;
case FMT_PCT:
ufmt = &cma;
goto deal_fmt;
case FMT_FXT:
ufmt = &fxt;
goto deal_fmt;
case FMT_USR:
ufmt = &u[prc];
prc = ufmt->prec;
goto deal_fmt;
case FMT_GEN:
if (prc != PRC_FLT)
return numb_oflo;
if (index (oldp, 'e') || !index (oldp, '.'))
goto handle_exp;
ufmt = &fxt;
prc = PRC_FLT;
goto deal_fmt;
deal_fmt:
if (prc != PRC_FLT)
return numb_oflo;
len = strlen (oldp);
bptr = (char *)strstr (oldp, ufmt->decpt);
if (!bptr)
return numb_oflo;
while (eptr = (char *)strstr (bptr + 1, ufmt->decpt))
bptr = eptr;
if (width < bptr - oldp)
return numb_oflo;
if (bptr - oldp + strlen (ufmt->decpt) >= width)
prc = 0;
else
{
prc = width - (strlen (ufmt->decpt) + bptr - oldp);
}
bptr = pr_flt (cp->cell_flt, ufmt, -prc);
len = strlen (bptr);
if (len > width && prc > 0)
{
bptr = pr_flt (cp->cell_flt, ufmt, -(prc - 1));
len = strlen (bptr);
}
if (len > width)
return numb_oflo;
break;
case FMT_EXP:
handle_exp:
{
double f;
f = fabs (cp->cell_flt);
if (f > 9.99999e99 || f < 1e-99)
len = width - 7;
else /* if(f>9.9999999e9 || f<1e-9) */
len = width - 6;
/* else
len=width-5; */
if (cp->cell_flt < 0)
--len;
if (len > 0)
{
sprintf (oldp, "%.*e", len, cp->cell_flt);
len = strlen (oldp);
if (len <= width)
{
bptr = oldp;
break;
}
}
}
return numb_oflo;
default:
bptr = 0;
len = 0;
#ifdef TEST
panic ("Unknown format %d in adjust_prc()", fmt);
#endif
break;
}
/* If we get here, bptr points to a a string of len characters
(len<=width) that we want to output */
if (len < smallwid)
{
if (just == JST_RGT || just == JST_CNT)
{
int n;
n = (just == JST_RGT) ? smallwid - len : (1 + smallwid - len) / 2;
for (;;)
{
bptr[len + n] = bptr[len];
if (len-- == 0)
break;
}
while (n-- >= 0)
bptr[n] = ' ';
}
}
return bptr;
}
#ifdef __STDC__
void
set_usr_stats (int usr_n, char **usr_buf)
#else
void
set_usr_stats (usr_n, usr_buf)
int usr_n;
char **usr_buf;
#endif
{
int len;
int i;
char *p_in, *p_out;
len = 0;
for (i = 0; i < 7; i++)
len += strlen (usr_buf[i]);
u[usr_n].p_hdr = ck_malloc (len + 7);
p_out = u[usr_n].p_hdr;
if (usr_buf[0][0])
{
p_in = usr_buf[0];
while (*p_out++ = *p_in++)
;
}
else
*p_out++ = '\0';
if (usr_buf[1][0])
{
p_in = usr_buf[1];
u[usr_n].n_hdr = p_out;
while (*p_out++ = *p_in++)
;
}
else
u[usr_n].n_hdr = 0;
if (usr_buf[2][0])
{
p_in = usr_buf[2];
u[usr_n].p_trl = p_out;
while (*p_out++ = *p_in++)
;
}
else
u[usr_n].p_trl = 0;
if (usr_buf[3][0])
{
p_in = usr_buf[3];
u[usr_n].n_trl = p_out;
while (*p_out++ = *p_in++)
;
}
else
u[usr_n].n_trl = 0;
if (usr_buf[4][0])
{
p_in = usr_buf[4];
u[usr_n].zero = p_out;
while (*p_out++ = *p_in++)
;
}
else
u[usr_n].zero = 0;
if (usr_buf[5][0])
{
p_in = usr_buf[5];
u[usr_n].comma = p_out;
while (*p_out++ = *p_in++)
;
}
else
u[usr_n].comma = 0;
if (usr_buf[6][0])
{
p_in = usr_buf[6];
u[usr_n].decpt = p_out;
while (*p_out++ = *p_in++)
;
}
else
u[usr_n].decpt = 0;
if (!stricmp (usr_buf[7], "float") || !stricmp (usr_buf[7], "f"))
u[usr_n].prec = 15;
else
u[usr_n].prec = astol (&usr_buf[7]);
u[usr_n].scale = astof (&usr_buf[8]);
}
#ifdef __STDC__
int
usr_set_fmts (void)
#else
int
usr_set_fmts ()
#endif
{
int n;
int ret = 0;
for (n = 0; n < 16; n++)
if (u[n].p_hdr)
ret |= 1 << n;
return ret;
}
#ifdef __STDC__
void
get_usr_stats (int usr_num, char **usr_buf)
#else
void
get_usr_stats (usr_num, usr_buf)
int usr_num;
char **usr_buf;
#endif
{
static char buf1[30];
static char buf2[30];
static char NullStr[] = "";
usr_buf[0] = u[usr_num].p_hdr ? u[usr_num].p_hdr : NullStr;
usr_buf[1] = u[usr_num].n_hdr ? u[usr_num].n_hdr : NullStr;
usr_buf[2] = u[usr_num].p_trl ? u[usr_num].p_trl : NullStr;
usr_buf[3] = u[usr_num].n_trl ? u[usr_num].n_trl : NullStr;
usr_buf[4] = u[usr_num].zero ? u[usr_num].zero : NullStr;
usr_buf[5] = u[usr_num].comma ? u[usr_num].comma : NullStr;
usr_buf[6] = u[usr_num].decpt ? u[usr_num].decpt : NullStr;
if (u[usr_num].prec == 15)
usr_buf[7] = "float";
else
{
sprintf (buf1, "%u", u[usr_num].prec);
usr_buf[7] = buf1;
}
sprintf (buf2, "%.12g", u[usr_num].scale);
usr_buf[8] = buf2;
}
/* Functions for printing out the names of cells and ranges */
#ifdef __STDC__
char *
cell_name (CELLREF rr, CELLREF cc)
#else
char *
cell_name (rr, cc)
CELLREF rr;
CELLREF cc;
#endif
{
static char strs[2][20];
static num = 0;
char *ptr;
num = num ? 0 : 1;
if (a0)
{
ptr = &strs[num][9];
sprintf (ptr, "%u", rr);
if (cc < MIN_COL + 26)
*--ptr = 'A' - MIN_COL + cc;
#if MAX_COL>702
else if (cc < MIN_COL + 702)
{
cc -= MIN_COL + 26;
*--ptr = 'A' + cc % 26;
*--ptr = 'A' + cc / 26;
}
else if (cc < MIN_COL + 18278)
{
cc -= MIN_COL + 702;
*--ptr = 'A' + cc % 26;
cc /= 26;
*--ptr = 'A' + cc % 26;
*--ptr = 'A' + cc / 26;
}
else
{
cc -= MIN_COL + 18278;
*--ptr = 'A' + cc % 26;
cc /= 26;
*--ptr = 'A' + cc % 26;
cc /= 26;
*--ptr = 'A' + cc % 26;
*--ptr = 'A' + cc / 26;
}
#else
else
{
cc -= MIN_COL + 26;
*--ptr = 'A' + cc % 26;
*--ptr = 'A' + cc / 26;
}
#endif
}
else
{
ptr = &strs[num][0];
sprintf (ptr, "r%uc%u", rr, cc);
}
return ptr;
}
#ifdef __STDC__
char *
range_name (struct rng *rng)
#else
char *
range_name (rng)
struct rng *rng;
#endif
{
CELLREF lr, lc, hr, hc;
static char buf[2][40];
static num;
char *ptr;
ptr = &buf[num][0];
num = num ? 0 : 1;
lr = rng->lr;
lc = rng->lc;
hr = rng->hr;
hc = rng->hc;
if (a0)
sprintf (ptr, "%s:%s", cell_name (lr, lc), cell_name (hr, hc));
else
{
if (lr == hr && lc == hc)
sprintf (ptr, "r%uc%u", lr, lc);
else if (lr == hr && lc != hc)
sprintf (ptr, "r%uc%u:%u", lr, lc, hc);
else if (lr != hr && lc == hc)
sprintf (ptr, "r%u:%uc%u", lr, hr, lc);
else
sprintf (ptr, "r%u:%uc%u:%u", lr, hr, lc, hc);
}
return ptr;
}
/* Parse a range, allowing variable names.
* Return 1 on failure, 0 on succes.
*/
#ifdef __STDC__
int
get_abs_rng (char **pptr, struct rng *retp)
#else
int
get_abs_rng (pptr, retp)
char **pptr;
struct rng *retp;
#endif
{
unsigned char n;
struct rng ignored;
if (!retp)
retp = &ignored;
while (**pptr == ' ')
(*pptr)++;
if (!**pptr)
return 1;
cur_row = curow;
cur_col = cucol;
n = parse_cell_or_range (pptr, retp);
if (!n)
{
struct var *v;
char *ptr;
ptr = *pptr;
while (ptr[n] && ptr[n] != ' ')
n++;
v = find_var (ptr, n);
if (!v)
return 1;
(*pptr) += n;
*retp = v->v_rng;
}
return 0;
}
#ifdef __STDC__
char *
col_to_str (CELLREF col)
#else
char *
col_to_str (col)
CELLREF col;
#endif
{
static char strs[2][10];
static num;
char *ptr;
ptr = &strs[num][9];
num = num ? 0 : 1;
if (col < MIN_COL + 26)
*--ptr = 'A' - MIN_COL + col;
#if MAX_COL>702
else if (col < MIN_COL + 702)
{
col -= MIN_COL + 26;
*--ptr = 'A' + col % 26;
*--ptr = 'A' + col / 26;
}
else if (col < MIN_COL + 18278)
{
col -= MIN_COL + 702;
*--ptr = 'A' + col % 26;
col /= 26;
*--ptr = 'A' + col % 26;
*--ptr = 'A' + col / 26;
}
else
{
col -= MIN_COL + 18278;
*--ptr = 'A' + col % 26;
col /= 26;
*--ptr = 'A' + col % 26;
col /= 26;
*--ptr = 'A' + col % 26;
*--ptr = 'A' + col / 26;
}
#else
else
{
col -= MIN_COL + 26;
*--ptr = 'A' + col % 26;
*--ptr = 'A' + col / 26;
}
#endif
return ptr;
}
#ifdef __STDC__
void
clear_spreadsheet (void)
#else
void
clear_spreadsheet ()
#endif
{
int n;
flush_everything ();
/* flush_widths(); */
flush_all_timers ();
for (n = 0; n < 16; n++)
{
if (u[n].p_hdr)
{
free (u[n].p_hdr);
u[n].p_hdr = 0;
u[n].prec = PRC_FLT;
u[n].scale = 1;
}
}
default_width = saved_default_width;
default_height = saved_default_height;
default_jst = JST_LFT;
default_fmt = FMT_GEN;
default_lock = LCK_UNL;
}
char *ename[] =
{
"#WHAT?",
"#ERROR", "#BAD_INPUT", "#NON_NUMBER", "#NON_STRING",
"#NON_BOOL", "#NON_RANGE", "#OUT_OF_RANGE", "#NO_VALUES",
"#DIV_BY_ZERO", "#BAD_NAME", "#NOT_AVAIL", "#PARSE_ERROR",
"#NEED_OPEN", "#NEED_CLOSE", "#NEED_QUOTE", "#UNK_CHAR",
"#UNK_FUNC",
0
};
char tname[] = "#TRUE";
char fname[] = "#FALSE";
#ifdef __STDC__
int
words_imatch (char ** ptr, char * key)
#else
int
words_imatch (ptr, key)
char ** ptr;
char * key;
#endif
{
char * str = * ptr;
while (isspace (*str))
++str;
while (isspace (*key))
++key;
while (1)
{
while (*str && *key && (toupper (*str) == toupper (*key)))
{
++str;
++key;
}
/* If we're not at word breaks in both strings... */
if (!((!*str || isspace (*str)) && (!*key || isspace (*key))))
return 0;
else
{
while (isspace (*key))
++key;
while (isspace (*str))
++str;
if (!*key)
{
*ptr = str;
return 1;
}
}
}
}
#ifdef __STDC__
int
parray_len (char ** array)
#else
int
parray_len (array)
char ** array;
#endif
{
int x;
for (x = 0; array[x]; ++x) ;
return x;
}
/* Return the index of CHECK in KEYS or -1. Case and whitespeace insenstive.
*/
#ifdef __STDC__
int
words_member (char ** keys, int len, char * check)
#else
int
words_member (keys, len, check)
char ** keys;
int len;
char * check;
#endif
{
int x;
for (x = 0; x < len; ++x)
{
char * ch = check;
if (words_imatch (&ch, keys[x]))
if (!*ch)
return x;
}
return -1;
}
#ifdef __STDC__
int
prompt_len (char * prompt)
#else
int
prompt_len (prompt)
char * prompt;
#endif
{
char * pos;
if (!prompt)
return 0;
for (pos = prompt; *pos && (*pos != '\n'); ++pos)
;
return pos - prompt;
}
#ifdef __STDC__
int
says_default (char * str)
#else
int
says_default (str)
char * str;
#endif
{
char * key = "ault";
if (strincmp(str, "def", 3))
return 0;
str += 3;
while (*str && *key)
{
if (tolower(*str) != *key)
return 0;
++key;
++str;
}
while (isspace(*str))
++str;
return !*str;
}